#ifndef JEFEDEESTACION_H_
#define JEFEDEESTACION_H_
#include <string>
#include <sstream>
#include "Proceso.h"
#include "fifo/FifoLectura.h"
#include "signal/SIGINT_Handler.h"
#include "signal/SignalHandler.h"
#include "GeneradorRandom.h"
#include "Constantes.h"
#include "Empleado.h"
#include <vector>
#include "Utilidades.h"

class JefeDeEstacion: public Proceso {

public:
	JefeDeEstacion(const string& nombreProceso, bool logActivo,
			const int cantEmpleados);

	void procesarCliente();
	~JefeDeEstacion();
	void setIdEmpleado(int nEmpleado, int idEmpleado);
	void addEmpleado(Empleado* empleado);
	// Borra todos los empleados y estructuras compartidas
	void eliminar();
	virtual void run();

private:
	// Atiende al cliente pasado por parámetro
	void procesarCliente(Cliente& cliente);
	void consumirCliente(const long int ultimoCliente);
	// Función auxiliar para inicializar recursos compartidos
	void prepararRecursos();
	// Agrega un empleado y sus estructuras compartidas
	void agregarEmpleado(int j);
	// Elimina un empleado y sus estructuras compartidas
	void eliminarEmpleado(const int nEmpleado);

private:
	FifoLectura fifo;
	int cantidad_empleados_;
	std::vector<MemoriaCompartida<Cliente> > memorias_jefe_empleado_;
	std::vector<MemoriaCompartida<bool> > empleados_ocupados_;
	std::vector<Semaforo> flags_memorias_;
	std::vector<Semaforo> flags_estado_;
	std::vector<int> indentificadores_empleados_;
	std::vector<Empleado*> procesos_empleado;
};

#endif /* JEFEDEESTACION_H_ */
